from utils import log_info, log_error, log_debug
from dao.users_dao import UserDAO
from models.user import User
from typing import Optional, Dict, Any
import sqlite3
import time

class UserService:
    """用户服务类，处理用户相关的业务逻辑"""

    def __init__(self):
        """
        初始化UserService
        """
        self.user_dao = UserDAO()


    def login(self, username: str, id_card: str) -> Dict[str, Any]:
        """
        处理用户登录
        :param username: 用户名
        :param id_card: 身份证号
        :return: 包含用户信息和登录状态的字典
        """
        try:
            # 检查用户是否存在
            user = self.user_dao.get_by_id_card(id_card)

            if user:
                # 用户存在，更新信息
                return self._update_existing_user(user, username)
            else:
                # 用户不存在，创建新用户
                return self._create_new_user(username, id_card)
        except Exception as e:
            log_error(f"登录过程中发生错误: {e}")
            return {'success': False, 'message': '登录失败，请重试'}

    def _update_existing_user(self, user: User, new_username: str) -> Dict[str, Any]:
        """
        更新已存在用户的信息
        :param user: 已存在的用户对象
        :param new_username: 新的用户名
        :return: 包含用户信息和登录状态的字典
        """
        try:
            # 更新用户名（如果有变化）
            if user.username != new_username:
                user.username = new_username

            # 更新最后登录时间
            current_time = time.strftime('%Y-%m-%d %H:%M:%S')
            user.last_login = current_time

            # 使用UserDAO更新用户信息
            if self.user_dao.update(user):
                user_info = {
                    'id': user.id,
                    'username': user.username,
                    'id_card': user.id_card,
                    'last_login': current_time
                }

                log_debug(f"用户 {user.username} (ID: {user.id}) 登录成功")
                return {'success': True, 'user_info': user_info}
            else:
                return {'success': False, 'message': '更新用户信息失败'}
        except Exception as e:
            log_error(f"更新用户信息时发生错误: {e}")
            return {'success': False, 'message': '更新用户信息失败'}

    def _create_new_user(self, username: str, id_card: str) -> Dict[str, Any]:
        """
        创建新用户
        :param username: 用户名
        :param id_card: 身份证号
        :return: 包含用户信息和登录状态的字典
        """
        try:
            # 检查身份证号是否已被使用
            existing_user = self.user_dao.get_by_id_card(id_card)
            if existing_user:
                return {'success': False, 'message': '身份证号已被注册'}

            # 检查用户名是否已被使用
            existing_user_by_name = self.user_dao.get_by_username(username)
            if existing_user_by_name:
                return {'success': False, 'message': '用户名已被使用'}

            current_time = time.strftime('%Y-%m-%d %H:%M:%S')
            user = User(username=username, id_card=id_card, last_login=current_time)
            user_id = self.user_dao.create(user)

            user_info = {
                'id': user_id,
                'username': username,
                'id_card': id_card,
                'last_login': current_time
            }

            log_debug(f"新用户 {username} (ID: {user_id}) 注册并登录成功")
            return {'success': True, 'user_info': user_info}
        except Exception as e:
            log_error(f"创建新用户时发生错误: {e}")
            return {'success': False, 'message': '创建用户失败，请重试'}

    def get_user_by_id(self, user_id: int) -> Optional[User]:
        """
        根据用户ID获取用户信息
        :param user_id: 用户ID
        :return: 用户对象，如果不存在返回None
        """
        return self.user_dao.get_by_id(user_id)

    def get_user_by_username(self, username: str) -> Optional[User]:
        """
        根据用户名获取用户信息
        :param username: 用户名
        :return: 用户对象，如果不存在返回None
        """
        return self.user_dao.get_by_username(username)

    def get_user_by_id_card(self, id_card: str) -> Optional[User]:
        """
        根据身份证号获取用户信息
        :param id_card: 身份证号
        :return: 用户对象，如果不存在返回None
        """
        return self.user_dao.get_by_id_card(id_card)